/// \file		ITCPServer.h
/// \brief		通信(TCP)客户端类的声明文件
/// \author		xuefeng
/// \version	1.0
/// \date		2011-07-19
/// \history	2011-07-19 新建

#pragma once
#include <string>

#ifndef _WINDCCOM_ENUM_DEF_
#define _WINDCCOM_ENUM_DEF_

/// \brief 连接状态枚举
enum ENU_CONNECT_STATUS
{
	E_CONNECT_SUCCESS,
	E_CONNECT_ADDRERROR,
	E_CONNECT_IOERROR,
	E_CONNECT_TIMEOUT,
};

/// \brief 断开连接状态枚举
enum ENU_DISCONNECT_STATUS
{
	E_DISCONNECT_USERASK,
	E_DISCONNECT_IOERROR,
	E_DISCONNECT_RCVTIMEOUT,
};

#endif //_WINDCCOM_ENUM_DEF_

/// \brief 通信(TCP)服务端通报类
class ITCPServerNotify
{
public:
	/*
		注意：由于线程时序的原因，有可能出现OnRecvServerData，先于OnAccept被调用的情况，
		如有同步需求，请在回调函数内自行处理。
	*/

	/// \brief 接受客户端连接回调
	/// \param ullClientID 客户端ID
	/// \param szClientIP 客户端IP
	/// \param usPort 客户器端口
	virtual void OnAccept(std::string sessionID, const char *szClientIP, unsigned short usPort) {}

	/// \brief 从客户端接收到数据回调(回调函数应复制数据后，立即返回，否则影响接收效率，MDF方式阻塞时间不得超过15s，否则断线)
	/// \param ullClientID 客户端ID
	/// \param pbData 数据指针(函数调用后即释放，勿超范围使用，勿在函数中删除)
	/// \param unDataSize 数据大小
	virtual void OnRecvClientData(std::string sessionID, const unsigned char *pbData, unsigned int unDataSize) {}

	/// \brief 从客户端接收数据异常回调
	/// \param ullClientID 客户端ID
	virtual void OnClientDataError(std::string sessionID) {}

	/// \brief 断开客户端网络连接回调
	/// \param ullClientID 客户端ID
	virtual void OnClientDisconnect(std::string sessionID) {}

	// 内部消息通知
	///< 调试信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_DEBUG = 0;
	/////< 普通信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_INFO = 1;
	/////< 警告信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_WARN = 2;
	/////< 错误信息
	//const EN_EVENT_TYPE WN_REPORT_LEVEL_ERROR = 3;
	virtual void OnTCPMsg(int type, std::string msg) {}
};

/// \brief 通信(TCP)服务端类
class ITCPServer
{
public:
	///注册回调接口
	virtual void RegisterSpi(ITCPServerNotify *pSpi) = 0;

	/// \brief 在指定端口启动TCP服务器侦听
	/// \param usPort 监听端口号
	/// \param blAuth 是否验证(暂不支持)
	virtual bool ServerListen(unsigned short usPort, bool blAuth = false) = 0;

	/// \brief 发送数据给指定的客户端
	/// \param ullClientID 客户端ID
	/// \param pbData 数据指针
	/// \param unDataSize 数据大小
	/// \return 是否发送成功
	virtual bool SendDataToClient(std::string sessionID, const unsigned char *pbData, unsigned int unDataSize) = 0;

	/// \brief 在指定端口启动非MDF协议的TCP服务器侦听(无心跳包，仅用于兼容现有的SpeedRelay而设计)
	/// \param usPort 监听端口号
	/// \param blAuth 是否验证(暂不支持)
	virtual bool OtherServerListen(unsigned short usPort, bool blAuth = false) = 0;

	/// \brief 发送数据给非MDF客户端(与OtherServerListen配对使用，仅用于兼容现有的SpeedRelay而设计)
	/// \param ullClientID 客户端ID
	/// \param pbData 数据指针
	/// \param unDataSize 数据大小
	/// \return 是否发送成功
	virtual bool SendDataToOtherClient(std::string sessionID, const unsigned char *pbData, unsigned int unDataSize) = 0;

	/// \brief 关闭TCP Server
	virtual void CloseSocket() = 0;
};

extern "C"
{
	/// \brief 创建服务端对象
	/// \param poNotifyObj 通报对象指针
	/// \param HBInterval 心跳间隔，单位毫秒(ms)
	/// \param usThreadCount 内部IOServices线程数目（0代表使用默认数值，2*cpu+1）
	/// \return 服务端对象指针(会自动删除，勿删除)
	ITCPServer* CreateTCPServerInstance(ITCPServerNotify* poNotifyObj, int HBInterval = 15000, unsigned short usThreadCount = 0);

	/// \brief 释放服务端对象
	/// \param poServerInstance 服务端对象指针
	void ReleaseTCPServerInstance(ITCPServer *poServerInstance);
}
